<?php
/**
 * 框架 - 视图类
 * 
 * @version $Id: View.php 427 2013-08-02 08:21:18Z linsir123 $
 * @package View
 */
class View
{
	/**
	 * @var 模板引擎
	 */
	public $engine;
	
	/**
	 * @var 视图类配置
	 */
	public $conf;
	
	/**
	 * @var 模板文件名
	 */
	public $template;
	
	/**
	 * @var 模板缓存ID
	 */
	public $cacheId;
	
	/**
	 * 构造函数
	 */
	public function __construct()
	{
		$this->conf = App::O('main.view');
		
		///
		if ($this->conf['engine'] == 'Smarty') 
			$this->_initSmarty();
	}
    
    /**
     * 设置Smarty属性
     * 
     * @param string $name
     * @param mixed $value
     */
    public function smartySet($name, $value)
    {
    	if ($this->engine) 
    		$this->engine->$name = $value;
    }
	
	/**
	 * 调用Smarty方法
	 * 
	 * @param string $name
	 * @param array $arguments
	 * @return mixed
	 */
	public function smartyCall($name)
	{
		if ($this->engine) {
			$params = func_get_args();
			array_shift($params);
			///
			return call_user_func_array(array($this->engine, $name), $params);
		}
		
		return false;
    }
	
	/**
	 * 配置缓存信息
	 */
	public function setCache()
	{
		$this->smartySet('caching', $this->conf['caching']);
		$this->smartySet('cache_lifetime', $this->conf['cache_lifetime']);
	}
	
	/**
	 * 配置模板信息
	 * 
	 * @param string $template 模板文件名
	 * @param string $cacheId 开当缓存时的缓存ID
	 */
	public function setTemplate($template, $cacheId = '')
	{
		$this->template = $template;
		$this->cacheId = $cacheId;
	}
	
	/**
	 * 由调度器来输出页面
	 */
	public function render()
	{
		if ( ! empty($this->template)) 
			$this->smartyCall('display', $this->template, $this->cacheId);
	}
	
	
	/// 以下为私有方法 ///
	
    
	/**
	 * 取得目录的相对路径
	 */
	private function _getDirRelative()
	{
		if (empty(App::$__subApp)) {
			$conf = App::O('main.appDefault');
			$relative = isset($conf['alias'])?trim($conf['alias']):null;
		} else 
			$relative = App::$__subApp;
			
		///
		return empty($relative) ? '' : DS . $relative;
	}
	
	/**
	 * 初始化Smarty
	 */
	private function _initSmarty()
	{
		App::V('smarty');
		
		///
		$relative= $this->_getDirRelative();
		$templateDir = APP_DIR .'Template'. $relative;
		$cacheDie = CACHE_DIR .'runtime/template/cache'. $relative;
		$compileDir = CACHE_DIR .'runtime/template/compile'. $relative;
		
		///
		$s = App::singleton('Smarty');
		$s->left_delimiter = '<{';
		$s->right_delimiter = '}>';
		$s->use_sub_dirs = $this->conf['use_sub_dirs'];
		$s->setTemplateDir($templateDir);
		$s->setCompileDir($compileDir);
		$s->setCacheDir($cacheDie);
		
		///
		$s->assign('domain', App::getRequest()->domain);
		$s->registerPlugin('modifier', 'substr', array('lpString', 'substr'));
		$s->registerPlugin('function', 'url', array('lpUrl', 'smartyUrl'));
		
		///
		$this->engine = $s;
		
		///
		lpDir::make($compileDir);
		lpDir::make($cacheDie);
	}
	
	
	/// 以下方法提供为静态调用 ///
	
	
	/**
	 * 判断模板是否缓
	 * // 由此方法配置缓存
	 * 
	 * @param string $template 模板文件名
	 * @param string $cacheId 开当缓存时的缓存ID
	 * @param string $suffix 模板文件后缀
	 * @return bool
	 * @static 
	 */
	static function isCached($template, $cacheId = '', $suffix = '.html')
	{
		$template .= $suffix;
		
		///
		$view = App::getView();
		$view->setCache();
		$view->setTemplate($template, $cacheId);
		return $view->smartyCall('isCached', $template, $cacheId);
	}
	
	/**
	 * 初始化模板信息
	 * 
	 * @param string $template 模板文件名
	 * @param string $cacheId 当开启缓存时的缓存ID
	 * @param string $suffix 模板文件后缀
	 * @static 
	 */
	static function display($template, $cacheId = '', $suffix = '.html')
	{
		$template .= $suffix;
		
		///
		App::getView()->setTemplate($template, $cacheId);
	}
	
	/**
	 * Smarty的assign方法
	 * // 也就是将数据输送到视图层
	 * 
	 * @param string $name 视图层的变量名
	 * @param mixed $value 待传送到视图层的数据
	 * @static 
	 */
	static function assign($name, $value)
	{
		App::getView()->smartyCall('assign', $name, $value);
	}
	
	/**
	 * 批量的{@assign}
	 * 
	 * @param array $data 待传送到视图层的数组
	 * @static 
	 */
	static function assignSet($data)
	{
		if (is_array($data) && ! empty($data)) 
			App::getView()->smartyCall('assign', $data);
	}
}
